package org.jeecg.modules.demo.seal.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class DateUtils {

    /**
     * 获取当前时间
     * @param type 类型 "yyyy-MM-dd HH:mm"
     * @return
     */
    public static String getCurrentTime(String type) {
        SimpleDateFormat sdf = new SimpleDateFormat(type);
        return sdf.format(new Date());
    }

    /**
     * 掉此方法输入所要转换的时间和类型 例如（"2014年06月14日16时09分00秒"  或者  "2014-06-14 16:09:00"）返回时间戳
     *
     * @param time 时间
     * @param type 类型    "yyyy年MM月dd日HH时mm分ss秒" 或者  "yyyy-MM-dd HH:mm:ss"
     * @return 时间戳
     */
    public static String dataToStamp(String time, String type) {
        SimpleDateFormat sdr = new SimpleDateFormat(type, Locale.CHINA);
        Date date;
        String times = null;
        try {
            date = sdr.parse(time);
            long l = date.getTime();
            String stf = String.valueOf(l);
            times = stf.substring(0, 10);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return times;
    }

    /**
     * 调用此方法输入所要转换的时间戳输入例如（1402733340）输出（"2014年06月14日16时09分00秒"  或者  "2014-06-14 16:09:00"）
     *
     * @param time 时间戳
     * @param type 类型    "yyyy年MM月dd日HH时mm分ss秒" 或者  "yyyy-MM-dd HH:mm:ss"
     * @return 指定格式的时间
     */
    public static String StampToData(String time, String type) {
        SimpleDateFormat sdr = new SimpleDateFormat(type);
        @SuppressWarnings("unused")
        long lcc = Long.valueOf(time);

        String times = sdr.format(new Date(lcc * 1000L));
        return times;

    }


    /**
     * 根据传递的类型格式化时间
     *
     * @param str
     * @param type 例如：yy-MM-dd
     * @return
     */
    public static String getDateByType(String str, String type) {

        Date date = new Date(Long.valueOf(str));

        SimpleDateFormat format = new SimpleDateFormat(type);

        String time = format.format(date);

        return time;
    }


    /**
     * 判断当前时间是否在[startTime, endTime]区间，注意时间格式要一致
     *
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return
     * @author jqlin
     */
    public static boolean isEffectiveDate(String startDate, String endDate) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Date nowTime = sdf.parse(getCurrentTime("yyyy-MM-dd HH:mm:ss"));
        Date startTime = sdf.parse(startDate);
        Date endTime = sdf.parse(endDate);

        if (nowTime.getTime() == startTime.getTime()
                || nowTime.getTime() == endTime.getTime()) {
            return true;
        }

        Calendar date = Calendar.getInstance();
        date.setTime(nowTime);

        Calendar begin = Calendar.getInstance();
        begin.setTime(startTime);

        Calendar end = Calendar.getInstance();
        end.setTime(endTime);

        if (date.after(begin) && date.before(end)) {
            return true;
        } else {
            return false;
        }

    }



    /**
     * 判断两个日期时间大小
     * 格式 yyyy-MM-dd HH:mm
     * @return
     */
    public static int dateCompare(String time1, String time2) throws ParseException {
        int i=0;
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Date date1 = dateFormat.parse(time1);//开始时间
        Date date2 = dateFormat.parse(time2);//结束时间

        if (date1.getTime()>date2.getTime()){
            //time1 大于 time2
            i= 1;
        }else if (date1.getTime()==date2.getTime()){
            //time1 等于 time2
            i= 2;
        }else if (date1.getTime()<date2.getTime()){
            //time1 小于 time2
            i= 3;
        }

        return  i;
    }

    /**
     * 判断两个时间大小
     * 格式 yyyy-MM-dd HH:mm
     * @return
     */
    public static int timeCompare(String time1, String time2) throws ParseException {
        int i=0;
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Date date1 = dateFormat.parse(time1);//开始时间
        Date date2 = dateFormat.parse(time2);//结束时间

        if (date1.getTime()>date2.getTime()){
            //time1 大于 time2
            i= 1;
        }else if (date1.getTime()==date2.getTime()){
            //time1 等于 time2
            i= 2;
        }else if (date1.getTime()<date2.getTime()){
            //time1 小于 time2
            i= 3;
        }
        return  i;
    }

    /**
     * 判断是否为今天(效率比较高)
     *
     * @param str 时间
     * @param type 类型  "yyyy-MM-dd HH:mm:ss" 或者  "yyyy-MM-dd"
     * @return true今天 false不是
     * @throws ParseException
     */
    public static boolean IsToday(String str, String type) throws ParseException {
        SimpleDateFormat dateFormat = new SimpleDateFormat(type);
        Calendar pre = Calendar.getInstance();
        Date predate = new Date(System.currentTimeMillis());
        pre.setTime(predate);

        Calendar cal = Calendar.getInstance();
        Date date = dateFormat.parse(str);
        cal.setTime(date);

        if (cal.get(Calendar.YEAR) == (pre.get(Calendar.YEAR))) {
            int diffDay = cal.get(Calendar.DAY_OF_YEAR) - pre.get(Calendar.DAY_OF_YEAR);
            if (diffDay == 0) {
                return true;
            }
        }
        return false;
    }

    /**
     * 计算两个日期间隔天数
     * @param beginTime 开始时间
     * @param endTime 结束时间
     * @param type 日期的格式  yyyy-MM-dd
     * @return 间隔天数
     */
    public static double interval(String beginTime, String endTime, String type){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(type);// 输入日期的格式
        Date date1 = null;
        try {
            date1 = simpleDateFormat.parse(beginTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Date date2 = null;
        try {
            date2 = simpleDateFormat.parse(endTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        GregorianCalendar cal1 = new GregorianCalendar();
        GregorianCalendar cal2 = new GregorianCalendar();
        cal1.setTime(date1);
        cal2.setTime(date2);
        double dayCount = (cal2.getTimeInMillis() - cal1.getTimeInMillis()) / (1000 * 3600 * 24);// 从间隔毫秒变成间隔天数
        return dayCount;
    }

    /**
     * 将秒转时分秒
     */
    public static String generateTime(long time) {
        int totalSeconds = (int) (time);
        int seconds = totalSeconds % 60;
        int minutes = (totalSeconds / 60) % 60;
        int hours = totalSeconds / 3600;

        return String.format("%02d:%02d:%02d", hours, minutes, seconds);
//        return hours > 0 ? String.format("%02d:%02d:%02d", hours, minutes, seconds) : String.format("%02d:%02d", minutes, seconds);
    }

    /**
     * 计算两个时间间隔秒数
     * @param beginTime 开始时间
     * @param endTime 结束时间
     * @param type 日期的格式  yyyy-MM-dd HH:mm:ss
     * @return 间隔秒
     */
    public static double intervalSeconds(String beginTime, String endTime, String type){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(type);// 输入日期的格式
        Date date1 = null;
        try {
            date1 = simpleDateFormat.parse(beginTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Date date2 = null;
        try {
            date2 = simpleDateFormat.parse(endTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        GregorianCalendar cal1 = new GregorianCalendar();
        GregorianCalendar cal2 = new GregorianCalendar();
        cal1.setTime(date1);
        cal2.setTime(date2);
        double secondsCount = (cal2.getTimeInMillis() - cal1.getTimeInMillis()) / (1000);// 从间隔毫秒变成间隔天数
        return secondsCount;
    }


    /**
     * 获取两个日期之间的所有日期
     *
     * @param startTime
     *            开始日期 yyyy-MM-dd
     * @param endTime
     *            结束日期 yyyy-MM-dd
     * @param type
     *            日期格式 yyyy-MM-dd
     * @return
     */
    public static List<String> getDays(String startTime, String endTime, String type) {

        // 返回的日期集合
        List<String> days = new ArrayList<String>();

        DateFormat dateFormat = new SimpleDateFormat(type);
        try {
            Date start = dateFormat.parse(startTime);
            Date end = dateFormat.parse(endTime);

            Calendar tempStart = Calendar.getInstance();
            tempStart.setTime(start);

            Calendar tempEnd = Calendar.getInstance();
            tempEnd.setTime(end);
            tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
            while (tempStart.before(tempEnd)) {
                days.add(dateFormat.format(tempStart.getTime()));
                tempStart.add(Calendar.DAY_OF_YEAR, 1);
            }

        } catch (ParseException e) {
            e.printStackTrace();
        }

        return days;
    }

    /**
     * 获取指定日期 前n天的日期
     * @param specifiedDay  指定时间
     * @param n     间隔天数 前为负数  后为正数
     * @param type  时间格式
     * @return
     */
    public static String getBeforeDay(String specifiedDay,Integer n,String type){
        Calendar c = Calendar.getInstance();
        Date date = null;
        try
        {
            date = new SimpleDateFormat(type).parse(specifiedDay);
        }
        catch (ParseException e)
        {
            e.printStackTrace();
        }
        c.setTime(date);
        int day = c.get(Calendar.DATE);
        c.set(Calendar.DATE, day - n);

        String dayBefore = new SimpleDateFormat(type).format(c.getTime());

        return dayBefore;

    }

    /**
     * 获取指定日期 后n天的日期
     * @param specifiedDay  指定时间
     * @param n     间隔天数 前为负数  后为正数
     * @param type  时间格式
     * @return
     */
    public static String getAfterDay(String specifiedDay,Integer n,String type){
        Calendar c = Calendar.getInstance();
        Date date = null;
        try
        {
            date = new SimpleDateFormat(type).parse(specifiedDay);
        }
        catch (ParseException e)
        {
            e.printStackTrace();
        }
        c.setTime(date);
        int day = c.get(Calendar.DATE);
        c.set(Calendar.DATE, day - n);

        String dayBefore = new SimpleDateFormat(type).format(c.getTime());

        return dayBefore;

    }
	
	
	/**
     * 获取指定日期的前N月
     * @param timeStr  指定时间
     * @param format  时间格式
     * @param num   间隔月数
     * @return
     */
    public static String getBeforeNumMonthOfTime(String timeStr, String format, int num) {
        Calendar cal = Calendar.getInstance();
        DateFormat simpleDateFormat = new SimpleDateFormat(format);
        try {
            Date date = simpleDateFormat.parse(timeStr);
            cal.setTime(date);
            cal.add(Calendar.MONTH, -num);
            Date time = cal.getTime();
            return simpleDateFormat.format(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }


    public static void main(String[] args) {
        String specifiedDay = "2020-11-31";
        Calendar c = Calendar.getInstance();
        Date date = null;
        try
        {
            date = new SimpleDateFormat("yyyy-MM-dd").parse(specifiedDay);
        }
        catch (ParseException e)
        {
            e.printStackTrace();
        }
        c.setTime(date);
        int day = c.get(Calendar.DATE);
        c.set(Calendar.DATE, day - 10);

        String dayBefore = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());

        System.out.println(dayBefore);

    }
}